/*****************************************
**  Nom : SALINAS        				**
**	Nom du fichier : ChngAvt.c			**
**	Description : Gestion du chainage 	**
**			      avant					**
**				  						**
**										**
**										**
**	Date : 14/08/2014				    **
**  Statut : Release					**
*****************************************/

/*****************************************
**  Zone de declaration des includes    **
*****************************************/

 #include "struct.h"

/**************************************************
**  [Fonction ChainageAvant]                     **
**    Lance toutes les fonctions ci-dessous      **
**************************************************/
void ChngAvt_ChainageAvant(ST_RES* Tete_Res, ST_FAITS* Tete_Faits)
{
	ST_FAITS *Fcourant=Tete_Faits;
	int Nb_chain=0;
	while(Fcourant!=NULL)
	{
		ChngAvt_ParcoursResultats(Fcourant->fait,Tete_Res,Nb_chain);
		ChngAvt_BoucleValidation(Tete_Res, Tete_Faits);
		Fcourant=Fcourant->suiv;
		Nb_chain++;
	}
}


/******************************************************
**  [Fonction ParcoursConditions]                    **
**    Parcours la liste chainée des conditions pour  **
**    un résultat donné et cherche les maillons      **
**    correspondant au fait "actuel"                 **
******************************************************/
void ChngAvt_ParcoursConditions(char *str, ST_RES *res,ST_COND *pt_Tete)
{
	ST_COND *courant=pt_Tete;
	while(courant != NULL)
	{	
		
		if(!strcmp(str,courant->cond))
		{
			printf("-----<%s> trouvé : <%s>-----\n",str,courant->cond);
			ChngAvt_ValideCondition(res,courant);
		}
		else
		{
			printf("-----<%s> non trouvé : <%s>-----\n",str,courant->cond);
			courant->valid=FALSE;
		}
		courant = courant->suiv;
	}
}


/**************************************************
**  [Fonction ValideCondition]                   **
**    Valide la condition si celle-ci est dans   **
**    les faits                                  **
**************************************************/
void ChngAvt_ValideCondition(ST_RES *resultat,ST_COND *condition)
{
	condition->valid=TRUE;
	resultat->nb_cond_valid = resultat->nb_cond_valid + 1;
}

/******************************************************
**  [Fonction ParcoursResultats]                     **
**    Parcours la liste chainée des resultats pour   **
**    chercher le(s) maillon(s) correspondant au     **
**    fait "actuel"                                  **
******************************************************/
void ChngAvt_ParcoursResultats(char *str, ST_RES *pt_Tete,int Nb_chain)
{
	ST_RES *courant=pt_Tete;
	while(courant != NULL)
	{
		if(Nb_chain == 0)
		{
			courant->nb_cond_valid =0;
			courant->valid = FALSE;
		}
		if(!strcmp(str,courant->res))
		{
			//printf("-----<%s> trouvé : <%s>-----\n",str,courant->res);
			ChngAvt_ValideResultat(courant);
		}
		ChngAvt_ParcoursConditions(str,courant,courant->TeteListCond);
		courant = courant->suiv;
	}
}


/**************************************************
**  [Fonction ValideResultat]                    **
**    Valide le resultat si celui-ci est dans    **
**    les faits                                  **
**************************************************/
void ChngAvt_ValideResultat(ST_RES *resultat)
{
	resultat->valid=TRUE;
}

/**************************************************
**  [Fonction BoucleValidation]                  **
**    Valide les resultats dont toutes les       **
**    conditions ont été validées                **
**************************************************/
void ChngAvt_BoucleValidation(ST_RES* Tete_Res, ST_FAITS* Tete_Faits)
{
	ST_RES *courant=Tete_Res;
	while(courant != NULL)
	{
		if(courant->valid==FALSE)
		{
			if(courant->nb_cond_valid == courant->nb_cond)
			{
				ChngAvt_ValideResultat(courant);
				if(ChainArr_VerifBut (courant->res,Tete_Res,Tete_Faits)==0)
				{
					printf("Rajout du maillon %s\n",courant->res);
					Tete_Faits=CreerListeCh_Creer_MaillonFaits(Tete_Faits,courant->res);
				}
			}
		}
		courant = courant->suiv;
	}
}
